import type {ExtractPropTypes, PropType, StyleValue} from 'vue'
import {definePropType} from "@/utils/vue/props/runtime";
import {buildProps, type DevMethods} from "@/utils";
import type {SortableOptions} from 'sortablejs'; // 只引入类型

export const devSearchTableProps = buildProps({
    // 表格样式
    style: {
        type: definePropType<StyleValue>([String, Object, Array])
    },
    // el-table的属性和方法
    elTableAttrs: {
        type: Object,
        default: () => ({})
    },
    // 表格列信息
    columns: {
        type: Array as () => {[key:string]:any}[],
        default: () => []
    },
    // 开启表格勾选,需要同时开启分页(isPagination)
    openSelection: {
        type: Boolean,
        default: false
    },
    // 使用自定义的索引
    openIndex: {
        type: Boolean,
        default: false
    },
    elTableColumnIndexAttrs:{
        type: Object,
        default: () => ({
            label: '序号',
            width: '60px',
            align: 'center',
        })
    },
    // 表格数据
    selectable: {
        type: Function as PropType<(row: any, index: number) => boolean>,
        default: (row: any, index: number) => {
            return true; // 根据需要返回 true 或 false
        }
    },
    api: {
        type: Function as PropType<(params?: any) => Promise<any>>,
        default: () => {
            return () => Promise.resolve({}); // 默认返回空 Promise，防止报错
        }
    },
    currentPageKey: {
        type: String,
        default: 'currentPage'
    },
    pageSizeKey: {
        type: String,
        default: 'pageSize'
    },
    totalKey: {
        type: String,
        default: 'total'
    },
    dataKey: {
        type: String,
        default: 'list'
    },
    // 是否分页
    isPagination: {
        type: Boolean,
        default: true
    },
    // 请求接口时携带参数
    query: {
        type: Object,
        default: () => ({})
    },
    // 开启排序
    openSortable: {
        type: Boolean,
        default: false
    },
    // 排序参数
    sortableOptions: {
        type: Object as PropType<SortableOptions>,
        default: () => ({
            animation: 150,
            sort: true,
            group: 'table'
        } as SortableOptions) // 明确类型
    },
    // 开启表头吸顶
    openHeaderSticky: {
        type: Boolean,
        default: false
    },
    // 开启滚动吸底
    openRollerSticky:{
        type: Boolean,
        default: true
    },
    // 滚动条吸底,距离底部距离
    rollerStickyBottom:{
        type: String,
        default: '10px'
    },
    // 表头吸顶距离顶部的距离
    headerStickyTop: {
        type: String,
        default: '0px'
    },
    // 表头吸顶的z-index
    headerStickyZIndex: {
        type: [Number, String],
        default: 50
    },
    // 容器名称
    containerName:{
        type: String,
        default: ''
    },
    // 开启滚动到指定位置
    openScrollTop:{
        type: Boolean,
        default: false
    },
    // 滚动到指定位置
    scrollTopNumber:{
        type: Number,
        default: 0
    },
    // 滚动行为
    scrollTopBehavior:{
        type:String as PropType<ScrollBehavior>,
        default: 'smooth'
    },
    // 处理接口返回的结果
    devSearchTableFieldsFn:{
        type: Function as PropType<DevMethods['devSearchTableFieldsFn']>,
    },
    // 当不调用接口时可以直接传递数据进去
    data:{
        type: Array as PropType<object[]>,
        default: () => []
    },
    // 是否调用接口
    openRequest:{
        type: Boolean,
        default: true
    },
    // 是否默认调用接口
    defaultRequest:{
        type: Boolean,
        default: true
    },
    // 表头吸顶刷新速度
    headerStickyRefreshSpeed:{
        type: Number,
        default: 0
    },
    // 内部参数（是否使用了devFormTable组件）
    isFormTable:{
        type: Boolean,
        default: false
    },
    // 内部参数（devSearchForm组件ref）
    devSearchFormRef:{
        type: Object as any,
        default: null
    },
    // 空数据时的提示
    emptyText:{
        type: String,
        default: '--'
    },
    // table底部页签配置
    elPaginationAttrs:{
        type: Object as PropType<Record<string, any>>,
        default: () => ({})
    }
} as const)
export type DevSearchTableProps = ExtractPropTypes<typeof devSearchTableProps>
